//////////////////////////////////////////////////////////////////////////

#ifndef _PARALLELPRIMESWING_H_
#define _PARALLELPRIMESWING_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _PRIMESWING_H_
#include "primeswing.h"
#endif

#include <boost/thread.hpp>

//////////////////////////////////////////////////////////////////////////


/** Parallel Prime Swing algorithm
*   It actually works the same way as Prime Swing one, but
*   Swing() functions are executed for different numbers at the same time 
*   in different threads, so it gives some speed gain.
* 
*   @author Roman Pasechnik
*   @since    Jan 07, 2009
*   @updated  Jan 08, 2009
*/
class ParallelPrimeSwing : public PrimeSwing
{
//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Computes factorial of integer number */
    virtual void RecFactorial( mpz_class& _result, int _number, PrimeSieve& _sieve );


    /** Thread procedure for swing calculation */
    void SwingThreadProc( mpz_class* _result, int _number, PrimeSieve* _sieve );


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
